import {Queue} from "../utils/BuffUtils";
import LogService from "./LogService";
import EventUtils from "../utils/EventUtils";
import MessageConfig from "../config/MessageConfig";
import BluDeviceComService from "./BluDeviceComService";

const APP_HEAD = [0xAA, 0x55];
const APP_TAIL = [0xBB, 0x44];

const DEVICE_HEAD = [0xBB, 0x44];
const DEVICE_TAIL = [0xAA, 0x55];

/**
 * 命令类型
 0x00:设备开关机
 0x01:查询设备所有参数
 0x02:设备音量设置
 0x03:设备时间校准
 0x04:是否有公仔头
 0x05:设备bgm设置
 0x06:设备mic开关
 0x07:设备总亮度
 0x08:设备倒计时设置
 0x09:定时开关机设置
 0x0a:设备mic灵敏度
 0x0b:设备公仔头设置
 0x0c:设备颜色组设置
 0x0d:查看版本号
 */
export const CMD_TYPE = {
  OC: 0x00, ASK: 0x01, SET_VOL: 0x02, SET_TIME: 0x03, SET_BGM: 0x05, SET_MIC: 0x06,
  SET_BRIGHT: 0x07, DELAY_CLOSE: 0x08, OC_TIME: 0x09, SET_MIC_LEVEL: 0x0a,
  LIGHT_HEAD: 0x0b, LIGHT_HEAD_COLOR: 0x0c, VERSION: 0x0d
};

/**
 * 灯头
 dj：08
 Asmr：07
 小马：06
 狮鹫：01
 河童：04
 水怪：03
 雪怪：02
 * @type {{}}
 */
export const LIGHT_HEAD_TYPE = {
  dj: 0X08, Asmr: 0x07, 小马: 0x06, 狮鹫: 0x01, 河童: 0x04, 水怪: 0x03, 雪怪: 0x02
};

class LightPackage {
  queue = new Queue(200);
  step = 0;
  matchHeadIndex = 0;
  len = 0;
  body = {};

  clearBuf() {
    this.queue.clear();
  }

  decode(arr) {
    this.queue.addArr(arr);
    while (true) {
      switch (this.step) {
        // 匹配头
        case 0:
          if (this.matchHead()) {
            LogService.debug("decode", "matchHead");
            this.step = 1;
          } else {
            return false;
          }
          break;
        // 长度
        case 1:
          if (this.queue.getSize() > 0) {
            this.len = this.queue.getData();
            this.step = 2;
            LogService.debug("decode", "len=" + this.len);
          } else {
            return false;
          }
          break;
        // 内容
        case 2:
          if (this.queue.getSize() >= this.len + 2) {
            this.step = 0;
            let contents = this.queue.getArr(this.len + 2);
            let size = contents.length;
            if (contents[size - 2] == DEVICE_TAIL[0] && contents[size - 1] == DEVICE_TAIL[1]) {
              this.decodeBody(contents);
              return true;
            } else {
              LogService.error(`错误的包结尾[${contents[size - 2]}, ${contents[size - 1]}]`);
            }
          } else {
            return false;
          }
          break;
      }
    }
  }

  decodeBody(contents) {
    this.body.type = contents[0];
    this.body.flag = contents[1];
  }

  matchHead() {
    while (this.queue.getSize() > 0) {
      let data = this.queue.getData();
      if (DEVICE_HEAD[this.matchHeadIndex] == data) {
        this.matchHeadIndex++;
      } else {
        this.matchHeadIndex = 0;
      }

      LogService.debug("matchHead", "step", this.matchHeadIndex);
      if (this.matchHeadIndex == 2) {
        this.matchHeadIndex = 0;
        return true;
      }
    }
    return false;
  }
}

const lightPackage = new LightPackage();

EventUtils.on(MessageConfig.BlE_RECV_TYPE, (res) => {
  const {deviceId, data} = res;
  let arr = [];
  let sucess = lightPackage.decode(data);
  if (sucess) {
    const {body} = lightPackage;
    switch (body.type) {
      // 询问时间
      case CMD_TYPE.SET_TIME:
        arr = PackageFactory.setTime();
        BluDeviceComService.sendData(deviceId, arr);
        break;
    }
    EventUtils.trigger(MessageConfig.DEVICE_RESPONSE, {lightPackage});
    LogService.debug("lightPackagex:", lightPackage);
  }
});

EventUtils.on(MessageConfig.BlE_CONNECT_TYPE, (res) => {
  lightPackage.clearBuf();
});

// lightPackage.decode([...DEVICE_HEAD, 3, 0x0d, 1, 1, ...DEVICE_TAIL]);
// LogService.debug("lightPackagex:", lightPackage);


export class PackageFactory {

  static addHeadTail(arr) {
    arr.unshift(arr.length);
    arr.unshift(APP_HEAD[1]);
    arr.unshift(APP_HEAD[0]);

    arr.push(APP_TAIL[0]);
    arr.push(APP_TAIL[1]);
  }

  // 开机
  static open() {
    const arr = [];
    arr.push(CMD_TYPE.OC);
    arr.push(1);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  // 关机
  static close() {
    const arr = [];
    arr.push(CMD_TYPE.OC);
    arr.push(0);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  // 询问设备参数
  static ask() {
    const arr = [];
    arr.push(CMD_TYPE.ASK);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  // 设置音量
  static setVol(vol) {
    const arr = [];
    arr.push(CMD_TYPE.SET_VOL);
    arr.push(vol);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  // 设置时间
  static setTime() {
    const arr = [];
    arr.push(CMD_TYPE.SET_TIME);
    let date = new Date();
    arr.push(date.getFullYear() % 100);
    arr.push(date.getMonth() + 1);
    arr.push(date.getDate());
    arr.push(date.getHours());
    arr.push(date.getMinutes());
    arr.push(date.getSeconds());
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 设置时间开关机
   * @param closeTime [时，分，秒]
   * @param openTime  [时，分，秒]
   * @param closeFlag 1 代表开启定时关机  0 代表关闭定时关机
   * @param openFlag  1 代表开启定时开机  0 代表关闭定时开机
   * @returns {*[]}
   */
  static setTimeOC(closeTime, openTime, closeFlag, openFlag) {
    let arr = [];
    arr.push(CMD_TYPE.OC_TIME);
    arr = arr.concat(closeTime);
    arr = arr.concat(openTime);
    arr.push(closeFlag);
    arr.push(openFlag);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 设置延时关机时间
   * @param time    单位 秒
   * @returns {[]}
   */
  static setDelayClose(time) {
    let arr = [];
    arr.push(CMD_TYPE.DELAY_CLOSE);
    arr.push(1);  // 定时关机开
    arr.push(time >> 8);
    arr.push(time % 256);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 设置亮度
   * @param value   0~100
   * @returns {[]}
   */
  static setBrightness(value) {
    const arr = [];
    arr.push(CMD_TYPE.SET_BRIGHT);
    arr.push(value);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 设置灯头 灯效
   * @param head    灯头
   * @param value   灯效
   * @returns {[]}
   */
  static setHead(head, value) {
    const arr = [];
    arr.push(CMD_TYPE.LIGHT_HEAD);
    arr.push(head);
    arr.push(value);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 设置灯效颜色数组
   * @param head    灯头
   * @param value   灯效
   * @param color   灯效颜色数组
   * @returns {[]}
   */
  static setBrightnessColor(head, value, color) {
    const arr = [];
    arr.push(CMD_TYPE.LIGHT_HEAD_COLOR);
    arr.push(head);
    arr.push(value);
    arr.push(...color);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 向飞碟灯推送关闭灯效背景音乐参数
   * @param head    灯头
   * @param bgm     00：关bgm
   */
  static setBgm(head, bgm) {
    const arr = [];
    arr.push(CMD_TYPE.SET_BGM);
    arr.push(head);
    arr.push(bgm);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 向飞碟灯推送关闭灯效声控参数
   * @param head    灯头
   * @param mic
   */
  static setMic(head, mic) {
    const arr = [];
    arr.push(CMD_TYPE.SET_MIC);
    arr.push(head);
    arr.push(mic);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 向飞碟灯推送灯效声控强度参数
   * @param head    灯头
   * @param level   强度等级1~10
   */
  static setMICLevel(head, level) {
    const arr = [];
    arr.push(CMD_TYPE.SET_MIC_LEVEL);
    arr.push(head);
    arr.push(level);
    PackageFactory.addHeadTail(arr);
    return arr;
  }

  /**
   * 询问软件版本号
   */
  static askVersion() {
    const arr = [];
    arr.push(CMD_TYPE.VERSION);
    PackageFactory.addHeadTail(arr);
    return arr;
  }
}







